﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Domain;
using Domain.Entities;

namespace Web.Models
{
    public class ShoppingCart
    {
        static EFDbContext storeDB = new EFDbContext(ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString);
        
        string ShoppingCartId { get; set; }
        public const string CartSessionKey = "CartId";

        public static ShoppingCart GetCart(HttpContextBase context)
        {
            var cart = new ShoppingCart();
            cart.ShoppingCartId = cart.GetCartId(context);
            return cart;
        }

        public static ShoppingCart GetCart(Controller controller)
        {
            return GetCart(controller.HttpContext);
        }

        public void AddToCart(ProduceInPackage package)
        {
            Cart cartItem = null;
            try
            {
                cartItem = storeDB.Carts.SingleOrDefault(
               c => c.CartId == ShoppingCartId
               && c.ProduceId == package.ProduceId &&
               c.PrepackageId == package.PrepackageId
               );
            }
            catch (Exception)
            {
                cartItem = null;
            }
           

            if (cartItem == null) // такого товара в корзине нет ... печалька
            {
                // Создаем новую запись а покупке
                cartItem = new Cart
                {
                    Prepackage = storeDB.Prepackages.FirstOrDefault(i=>i.Id==package.PrepackageId),
                    PrepackageId = package.PrepackageId,
                    Produce = storeDB.Produces.FirstOrDefault(i=>i.Id==package.ProduceId),
                    CartId = ShoppingCartId,
                    Count = 1,
                    Price = package.Price,
                    DateCreated = DateTime.Now
                };
                storeDB.Carts.Add(cartItem);
               
            }
            else
            {
                // Этот товар присутствует в корзине, увеличим его в числе
                cartItem.Count++;        
            }
            try
            {
                // сохраним изменение
                storeDB.SaveChanges();
            }
            catch (Exception)
            {

            }
          
        }

        public int RemoveFromCart(int id) // удаление с заказа
        {
                   
            var cartItem = storeDB.Carts.FirstOrDefault(
               cart=>cart.Id == id);

            int itemCount = 0;

            if (cartItem != null)
            {
                if (cartItem.Count > 1)
                {
                    cartItem.Count--;
                    itemCount = cartItem.Count;
                }
                else
                {
                    storeDB.Carts.Remove(cartItem);
                }
                // Save changes
                storeDB.SaveChanges();
            }
            return itemCount;
        }

        public void EmptyCart()
        {
            var cartItems = storeDB.Carts.Where(
                cart => cart.CartId == ShoppingCartId);

            foreach (var cartItem in cartItems)
            {
                storeDB.Carts.Remove(cartItem);
            }
            // Save changes
            storeDB.SaveChanges();
        }

        public List<Cart> GetCartItems()
        {

            return  storeDB.Carts.Where(
                cart => cart.CartId == ShoppingCartId).ToList();


           
        }

        public int GetCount()
        {
            int count = 0;

            try
            {
                // получение количества товара в корзине и сумма покупки
                 var c = (from cartItems in storeDB.Carts
                              where cartItems.CartId == ShoppingCartId
                              select (int?)cartItems.Count).Sum();
                // Return 0 if all entries are null
                return (int)c + count;
            }
            catch (Exception)
            {

                return count;
            }
           
        }

        public double GetTotal()
        {
            var store = storeDB.Carts.Where(i => i.CartId == ShoppingCartId).ToList();
            return (from cart in store let pack = storeDB.ProduceInPackages.FirstOrDefault(i => i.ProduceId == cart.ProduceId && i.PrepackageId == cart.PrepackageId) select cart.Count*pack.Price).Sum();
        }
        
        public string GetCartId(HttpContextBase context)
        {
            if (context.Session[CartSessionKey] == null)
            {
                if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
                {
                    context.Session[CartSessionKey] =
                        context.User.Identity.Name;
                }
                else
                {
                    // Generate a new random GUID using System.Guid class
                    Guid tempCartId = Guid.NewGuid();
                    // Send tempCartId back to client as a cookie
                    context.Session[CartSessionKey] = tempCartId.ToString();
                }
            }
            return context.Session[CartSessionKey].ToString();
        }

        public void MigrateCart(string userName)
        {
            var shoppingCart = storeDB.Carts.Where(
                c => c.CartId == ShoppingCartId);

            foreach (Cart item in shoppingCart)
            {
                item.CartId = userName;
            }
            storeDB.SaveChanges();
        }

        int GetStoreIdByProduceAndPackage(int packId, int produceId)
        {

            return storeDB.ProduceInPackages
                .FirstOrDefault(i => i.PrepackageId == packId && i.ProduceId == produceId).Id;
        }

        public int CreateOrder(Order order)
        {
            order.OrderDate = DateTime.Now;
            order.OrderStatusId = 1; // новый заказ => статус не обработано
            order.Total = GetTotal(); // общую сумму пересчитаем!!!
            storeDB.Orders.Add(order);  //  запишем заказ в базу данных
            storeDB.SaveChanges();
            //----------------------------------------------------------------//
            // в таблицу OrderDetail запишем подробности нашего заказа
            var cartItems = GetCartItems();
            foreach (var item in cartItems)
            {
                var orderDetail = new OrderDetail
                {
                    ProduceInPackageId = GetStoreIdByProduceAndPackage(item.PrepackageId,item.ProduceId),
                    OrderId = order.Id,
                    UnitPrice = item.Price,
                    Quantity = item.Count
                };
                storeDB.OrderDetails.Add(orderDetail);
            }
            storeDB.SaveChanges();
            //-----------------------------------------------------------------//

            EmptyCart(); // после оформления заказа необходимо очистить корзину !
            return order.Id;
        }
       }
      
       
}